From 7031746224c2c274548596b5ee1e856360d860c5 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Wed, 27 Sep 2006 14:28:26 +0100 Subject: [PATCH] [XEN] gdbstub return value is used to determine whether or not to continue execution. Signed-off-by: Keir Fraser --- xen/common/gdbstub.c | 26 ++++++++------------ xen/include/asm-x86/debugger.h | 43 ++++++---------------------------- 2 files changed, 17 insertions(+), 52 deletions(-) diff --git a/xen/common/gdbstub.c b/xen/common/gdbstub.c index 708357c56a..54a81680a7 100644 --- a/xen/common/gdbstub.c +++ b/xen/common/gdbstub.c @@ -506,14 +506,13 @@ gdbstub_console_puts(const char *str) int __trap_to_gdb(struct cpu_user_regs *regs, unsigned long cookie) { - int resume = 0; - int r; + int rc = 0; unsigned long flags; if ( gdb_ctx->serhnd < 0 ) { dbg_printk("Debugger not ready yet.\n"); - return 0; + return -EBUSY; } /* We rely on our caller to ensure we're only on one processor @@ -532,7 +531,7 @@ __trap_to_gdb(struct cpu_user_regs *regs, unsigned long cookie) { printk("WARNING WARNING WARNING: Avoiding recursive gdb.\n"); atomic_inc(&gdb_ctx->running); - return 0; + return -EBUSY; } if ( !gdb_ctx->connected ) @@ -565,19 +564,14 @@ __trap_to_gdb(struct cpu_user_regs *regs, unsigned long cookie) gdb_cmd_signum(gdb_ctx); } - while ( resume == 0 ) - { - r = receive_command(gdb_ctx); - if ( r < 0 ) - { - dbg_printk("GDB disappeared, trying to resume Xen...\n"); - resume = 1; - } - else + do { + if ( receive_command(gdb_ctx) < 0 ) { - resume = process_command(regs, gdb_ctx); + dbg_printk("Error in GDB session...\n"); + rc = -EIO; + break; } - } + } while ( process_command(regs, gdb_ctx) == 0 ); gdb_arch_exit(regs); console_end_sync(); @@ -586,7 +580,7 @@ __trap_to_gdb(struct cpu_user_regs *regs, unsigned long cookie) local_irq_restore(flags); - return 0; + return rc; } void diff --git a/xen/include/asm-x86/debugger.h b/xen/include/asm-x86/debugger.h index 3e5debebd8..743dc2d8e5 100644 --- a/xen/include/asm-x86/debugger.h +++ b/xen/include/asm-x86/debugger.h @@ -15,14 +15,13 @@ * 2. debugger_trap_fatal(): * Called when Xen is about to give up and crash. Typically you will use this * hook to drop into a debug session. It can also be used to hook off - * deliberately caused traps (which you then handle and return non-zero) - * but really these should be hooked off 'debugger_trap_entry'. + * deliberately caused traps (which you then handle and return non-zero). * * 3. debugger_trap_immediate(): * Called if we want to drop into a debugger now. This is essentially the * same as debugger_trap_fatal, except that we use the current register state * rather than the state which was in effect when we took the trap. - * Essentially, if we're dying because of an unhandled exception, we call + * For example: if we're dying because of an unhandled exception, we call * debugger_trap_fatal; if we're dying because of a panic() we call * debugger_trap_immediate(). */ @@ -44,42 +43,19 @@ #include -#define __debugger_trap_entry(_v, _r) (0) - -static inline int __debugger_trap_fatal( +static inline int debugger_trap_fatal( unsigned int vector, struct cpu_user_regs *regs) { - (void)__trap_to_gdb(regs, vector); - return (vector == TRAP_int3); /* int3 is harmless */ + return (__trap_to_gdb(regs, vector) == 0); } /* Int3 is a trivial way to gather cpu_user_regs context. */ #define debugger_trap_immediate() __asm__ __volatile__ ( "int3" ); -#elif 0 - -extern int kdb_trap(int, int, struct cpu_user_regs *); - -static inline int __debugger_trap_entry( - unsigned int vector, struct cpu_user_regs *regs) -{ - return 0; -} - -static inline int __debugger_trap_fatal( - unsigned int vector, struct cpu_user_regs *regs) -{ - return kdb_trap(vector, 0, regs); -} - -/* Int3 is a trivial way to gather cpu_user_regs context. */ -#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" ) - #else -#define __debugger_trap_entry(_v, _r) (0) -#define __debugger_trap_fatal(_v, _r) (0) -#define __debugger_trap_immediate() ((void)0) +#define debugger_trap_fatal(v, r) (0) +#define debugger_trap_immediate() ((void)0) #endif @@ -96,12 +72,7 @@ static inline int debugger_trap_entry( return 1; } - return __debugger_trap_entry(vector, regs); + return 0; } -#define debugger_trap_fatal(v, r) (__debugger_trap_fatal(v, r)) -#ifndef debugger_trap_immediate -#define debugger_trap_immediate() (__debugger_trap_immediate()) -#endif - #endif /* __X86_DEBUGGER_H__ */ -- 2.30.2